package gestion.camping.controleur;

import gestion.camping.connexion.Connexion;
import gestion.camping.dao.impl.SaisonDao;
import gestion.camping.dto.Saison;
import gestion.camping.utils.DateFormatUtils;
import gestion.camping.utils.MessagesUtil;
import gestion.camping.vue.ViewErreur;
import gestion.camping.vue.ViewSaisonDetail;
import gestion.camping.vue.ViewSaisonListe;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.JDialog;

public class SaisonController{
	
	private Saison saison;
	private List<Saison> listSaison;
	private SaisonDao saisonDao = new SaisonDao(Connexion.getInstance());
	private ViewSaisonDetail frameDetail;
	private ViewSaisonListe frameListe;
	private boolean isPossibleEnregistrer;
	private Date dateDebut;
	private Date dateFin;
	
	/**
	 * Constructeur du controlleur saison
	 */
	public SaisonController(){
		this.isPossibleEnregistrer = true;
	}
	
	public SaisonController(boolean isPossibleEnregistrer){
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}

	/**
	 * Accesseur à l'attribut saison
	 * @return saison
	 */
	public Saison getSaison() {
		return saison;
	}

	/**
	 * Permet la modification de l'attribut saison de l'instance courante
	 * @param saison
	 */
	public void setSaison(Saison saison) {
		this.saison = saison;
	}
	
	/**
	 * Accesseur aux JPanel contenant la liste des saisons
	 * @return JPanel viewListe
	 */
	public ViewSaisonListe getViewListe(){
		
		if(listSaison == null){
			listSaison = new ArrayList<Saison>();
		}
		
		
		//On crée la fenêtre
		frameListe = new ViewSaisonListe(this);
	
		rechercher(null, null);
		
		return frameListe;
	}
	
	/**
	 * Accesseur aux JPanel contenant le détail d'une personne
	 * @return JPanel viewDetail
	 */
	public JDialog getViewDetail(){
		
		// Si personne est différent de null 
		if(saison == null){
			//on est en création
			//On crée un objet vide
			saison = new Saison();
		}
				
		//On crée la fenêtre
		frameDetail = new ViewSaisonDetail(this);
		
		frameDetail.setVisible(true);
		
		return frameDetail;
	}

	/**
	 * Accesseur à la liste des saisons
	 * @return Liste des saisons
	 */
	public List<Saison> getListSaison() {
		return listSaison;
	}

	/**
	 * Permet la modification de la liste de saison
	 * @param listSaison
	 */
	public void setListSaison(List<Saison> listSaison) {
		this.listSaison = listSaison;
	}

	/**
	 * Permet la gestion de l'action utilisateur Enregistrer
	 * @param personne
	 */
	public void enregistrer(Saison saison) {
		System.out.println(saison.toString());
		
		if(saison.getDateDebut() == null || saison.getDateFin() == null){
			JDialog viewErreur = new ViewErreur(MessagesUtil.formatMessage("erreur.date.format"));
			viewErreur.setVisible(true);
		}else {
			this.saison = saison;
			
			if(isPossibleEnregistrer){
				//Si l'ID est zéro
				if(saison.getId() == 0){ 
					//On est en création
					saison = saisonDao.create(saison);
				}else{
					//On n'est en modification
					saison = saisonDao.update(saison);
				}
				frameDetail.setSaison(saison);
			}			
		}		
	}

	/**
	 * Permet la gestion de l'action utilisateur Rechercher
	 */
	public void rechercher(Date dateDebut, Date dateFin) {
		if(dateDebut == null && dateFin == null){
			this.listSaison = saisonDao.findAllSaison();
		}else{
			this.listSaison = saisonDao.findByDate(dateDebut, dateFin);
			this.dateDebut = dateDebut;
			this.dateFin = dateFin;
		}
		frameListe.setListSaison(listSaison);
	}

	/**
	 * Permet la gestion de l'action utilisateur Modifier
	 * @param personne
	 */
	public void modifier(Saison saison) {
		//On affecte la saison que l'on veut modifier	
		this.saison = saison;
		
		//On affiche la fenêtre de détail
		this.getViewDetail();
	}

	/**
	 * Permet la gestion de l'action utilisateur Retour à liste 
	 */
	public void retour() {
		if(isPossibleEnregistrer){
			//Si une recherche avait été faite
			if(listSaison != null && listSaison.size() > 0){
				//On effectue la dernière recherche
				rechercher(dateDebut, dateFin);
			}
		}else{
			if(listSaison != null){
				//On recherche si la personne et déja présente dans la lite
				int i;
				for(i=0; i<listSaison.size() && listSaison.get(i).getId() != saison.getId(); i++);
				if(i == listSaison.size()){
					listSaison.add(saison);
				}else{
					listSaison.remove(i); 
					listSaison.add(i, saison);
				}
				
				//On met à jour la fenêtre
				frameListe.setListSaison(listSaison);
				
			}
		}
		
	}
	

	/**
	 * Permet la gestion de l'action utilisateur Ajouter 
	 */
	public void ajouter(){
		this.saison = new Saison();
		
		
		this.getViewDetail();
	}

	public boolean isPossibleEnregistrer() {
		return isPossibleEnregistrer;
	}

	public void setPossibleEnregistrer(boolean isPossibleEnregistrer) {
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}

	public String getDateDebutString() {
		if(dateDebut != null){
			return DateFormatUtils.formatDate(dateDebut);
		}else{
			return null;
		}
	}

	public String getDateFinString() {
		if(dateFin != null){
			return DateFormatUtils.formatDate(dateFin);
		}else{
			return null;
		}
	}
	
}
